﻿using Microsoft.AspNetCore.Http;
using Microsoft.Extensions.Options;
using System.Reflection.PortableExecutable;
using System.Threading.Tasks;

namespace Sgr.AspNetCore.Middlewares.Security
{
    /// <summary>
    /// 安全头部中间件
    /// 用于配置各种 HTTP 安全头部，包括 PoweredBy、XSS Protection 等
    /// </summary>
    public class SecurityHeadersMiddleware
    {
        private readonly RequestDelegate _next;
        private readonly SecurityHeadersOptions _options;

        /// <summary>
        /// 初始化安全头部中间件
        /// </summary>
        /// <param name="next">请求委托</param>
        /// <param name="options">配置选项</param>
        public SecurityHeadersMiddleware(RequestDelegate next, IOptions<SecurityHeadersOptions> options)
        {
            _next = next;
            _options = options.Value ?? new();
        }

        /// <summary>
        /// 处理 HTTP 请求
        /// </summary>
        /// <param name="context">HTTP 上下文</param>
        /// <returns>异步任务</returns>
        public Task InvokeAsync(HttpContext context)
        {
            // 添加 PoweredBy 头部
            if (_options.EnabledPoweredBy)
            {
                context.Response.Headers[_options.PoweredByHeaderName] = _options.PoweredByHeaderValue;
            }

            // 添加安全头部
            if (_options.EnableSecurityHeaders)
            {
                AddSecurityHeaders(context);
            }

            // 添加缓存控制头部
            if (_options.EnableCacheControl)
            {
                AddCacheControlHeaders(context);
            }

            return _next.Invoke(context);
        }

        /// <summary>
        /// 添加缓存控制相关的 HTTP 头部
        /// </summary>
        /// <param name="context">HTTP 上下文</param>
        private void AddCacheControlHeaders(HttpContext context)
        {
            var headers = context.Response.Headers;

            // 设置Cache-Control
            headers.CacheControl = _options.CacheControl;

            // 设置Pragma no-cache
            if (_options.EnablePragmaNoCache)
            {
                headers.Pragma = "no-cache";
            }

            // 设置Expires
            if (_options.EnableExpires)
            {
                headers.Expires = "-1";
            }
        }

        /// <summary>
        /// 添加安全相关的 HTTP 头部
        /// </summary>
        /// <param name="context">HTTP 上下文</param>
        private void AddSecurityHeaders(HttpContext context)
        {
            var headers = context.Response.Headers;

            // 添加 XSS Protection
            // 启用浏览器内置的 XSS 过滤器
            if (_options.EnableXssProtection)
            {
                headers.XXSSProtection = "1; mode=block";
            }

            // 添加 Content Type Options
            // 防止浏览器进行 MIME 类型嗅探
            if (_options.EnableContentTypeOptions)
            {
                headers.XContentTypeOptions = "nosniff";
            }

            // 添加 Frame Options
            // 防止网站被嵌入到 iframe 中，避免点击劫持
            if (_options.EnableFrameOptions)
            {
                headers.XFrameOptions = "DENY";
            }

            // 添加内容安全策略
            // 控制浏览器可以为当前页面加载哪些资源
            if (_options.EnableContentSecurityPolicy)
            {
                headers.ContentSecurityPolicy = _options.ContentSecurityPolicy;
            }
        }
    }
}